package at.donalfonso.ui.group;

import java.util.ArrayList;
import java.util.Random;

import org.mozartspaces.capi3.KeyCoordinator;
import org.mozartspaces.core.Capi;
import org.mozartspaces.core.CapiUtil;
import org.mozartspaces.core.Entry;
import org.mozartspaces.core.MzsCoreException;
import org.mozartspaces.core.MzsConstants.RequestTimeout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import at.donalfonso.model.Gruppe;
import at.donalfonso.model.GruppeStatus;
import at.donalfonso.utility.SpaceUtility;

public class GruppeThread extends Thread {

	private SpaceUtility space;
	private Capi capi;
	private Gruppe gruppe;
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	private Random random;
	
	public GruppeThread(Gruppe gruppe) {
		this.gruppe = gruppe;
		space = new SpaceUtility(gruppe.getFilialID());
		capi = space.getCapi();
		random = new Random();
	}
	
	@Override
	public void run() {
		ArrayList<Gruppe> lg;
		
		try {
			// Anstellen am Eingang
			capi.write(new Entry(gruppe), space.getEingangContainer());
			
			// warte auf Platzzuweisung durch Kellner
			lg = capi.take(space.getGruppeSitzenContainer(), KeyCoordinator.newSelector(gruppe.getId()), RequestTimeout.INFINITE, null);
			gruppe = CapiUtil.getSingleEntry(lg);
			Thread.sleep(1000);
			logger.debug("GruppeThread " + gruppe.getId() + ": stelle Gruppe in GruppeBestellt");
			// Bestellwunsch
			capi.write(space.getGruppeWillBestellenContainer(), new Entry(gruppe));
			
			// warte auf Essen
			lg = capi.take(space.getGruppeEssenContainer(), KeyCoordinator.newSelector(gruppe.getId()), RequestTimeout.INFINITE, null);
			gruppe = CapiUtil.getSingleEntry(lg);
			logger.debug("Gruppe " + gruppe.getId() + ": beginne Essen");
			Thread.sleep((random.nextInt(3) + 3) * 1000);
			logger.debug("Gruppe " + gruppe.getId() + ": fertig gegessen, stelle mich in GruppeBezahlen");
			gruppe.setStatus(GruppeStatus.BEZAHLEN);
			// Bezahlwunsch
			capi.write(space.getGruppeWillBezahlenContainer(), new Entry(gruppe));
			
			// bezahlt, wir können gehen
			Thread.sleep(random.nextInt(2) * 1000);
			lg = capi.take(space.getGruppeHatBezahltContainer(), KeyCoordinator.newSelector(gruppe.getId()), RequestTimeout.INFINITE, null);
			gruppe = CapiUtil.getSingleEntry(lg);
			gruppe.setStatus(GruppeStatus.GEGANGEN);
			capi.write(space.getGruppeGegangenContainer(), new Entry(gruppe));
			logger.debug("Gruppe " +  gruppe.getId() + ": gegangen");
			
		} catch (MzsCoreException | InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
